import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { useUserStore } from './userStore';
import { insertCart, getCartList, delCartInfo } from '@/apis/cart';

export const useCartStore = defineStore('cart',
    () => {
        // 获取用户store
        const userStore = useUserStore();
        const isLogin = computed(() => userStore.userInfo.token);

        // 功能封装 — 获取最新的购物车数据
        const getNewCartList = async () => {
            const res = await getCartList();
            console.log("最新购物车数据", res.result);
            cartList.value = res.result;
        }
        // 1. 定义state - cartList，外层是ref，内层数据是 reactive
        const cartList = ref([]);

        // 2. 定义action - 添加购物车 addCart
        const addCart = async (goods) => {
            if (isLogin.value) {
                // 登录后 加入购物车
                await insertCart({
                    skuId: goods.skuId,
                    count: goods.count
                });

                // 调用封装函数，获取最新购物车数据
                getNewCartList();
                // const newGoods = ref([]);

                /*  // 将本地购物车数据与后端服务器数据合并
                 res.result.forEach((item1) => {
                     const goodsObj = cartList.value.find((item2) => item1.skuId === item2.skuId);
                     if (goodsObj) {
                         goodsObj.count++;
                     } else {
                         newGoods.value.push(item1);
                     }
                 })
                 cartList.value = [...cartList.value, ...newGoods.value]; */

            } else {
                // 未登录 添加购物车操作
                // 已添加过 购物车 count + 添加商品 count
                // 未添加过 直接push
                // 思路：通过匹配传递过来的商品中的skuId是否在cartList中找到，找到了就是添加过
                // 使用 find 是因为可以返回相同的商品信息，方便商品数量属性的改变
                const goodsInfo = cartList.value.find((item) => (item.skuId === goods.skuId));
                console.log(goodsInfo);
                if (goodsInfo) {
                    goodsInfo.count += goods.count;

                } else {
                    cartList.value.push(goods);
                }
            }
        }

        // 删除购物车某一项数据，根据skuId（唯一）
        const delCart = async (skuId) => {
            if (isLogin.value) {
                // 登录 删除功能
                // 调用接口实现接口购物车中的删除功能
                await delCartInfo([skuId]);

                // 调用封装函数，获取最新购物车数据
                getNewCartList();

            } else {
                // 未登录 删除功能
                cartList.value = cartList.value.filter((item) => item.skuId !== skuId);
            }
        }

        // 清空购物车
        const clearCart = () => {
            cartList.value = [];
        }

        // 单选功能
        const singleCheck = (selected, skuId) => {
            // 根据 skuId 找到要修改的那一项，然后把它的 selected 修改为 传过来的selected
            const goodsInfo = cartList.value.find((item) => item.skuId === skuId);
            goodsInfo.selected = selected;
        }

        // 全选功能

        const allSelectedCheck = (selected) => {
            console.log("多选框", selected);

            cartList.value.forEach((item) => {
                item.selected = selected
            })
        }

        // 计算商品的总数量（数量之和）
        const totalAmount = computed(() => {
            return cartList.value.reduce((total, item) => {
                return total + item.count
            }, 0);
        });

        // 计算商品的总金额（数量*金额之和）
        const totalPrice = computed(() => {
            return cartList.value.reduce((total, item) => {
                return total + item.count * item.price
            }, 0);
        });

        // 计算是否全选
        const allSelected = computed(() => {
            console.log("执行了，哈哈哈哈哈");

            return cartList.value.length === 0 ? false : cartList.value.every((item) => item.selected);
        })

        // 计算选中的商品数量
        const selectedGoods = computed(() => {
            return cartList.value.filter((item) => item.selected === true)
                .reduce((total, item) => (total + item.count), 0);
        });

        // 计算选中商品的总金额
        const selectedTotalPrice = computed(() => {
            return cartList.value.reduce((total, item) => {
                if (item.selected) {
                    return total + item.count * item.price
                }
                return total;
            }, 0)
        });

        return {
            cartList,
            allSelected,
            addCart,
            delCart,
            singleCheck,
            allSelectedCheck,
            totalAmount,
            totalPrice,
            selectedGoods,
            selectedTotalPrice,
            clearCart,
            getNewCartList
        }
    },
    {
        persist: true
    });